package com.itheima.springboot_reggie.web;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.springboot_reggie.common.R;
import com.itheima.springboot_reggie.emtity.Category;
import com.itheima.springboot_reggie.service.ICategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/category")
public class CategoryController {

    @Autowired
    ICategoryService categoryService;

    /**
     *      新增分类:
     *请求url地址： /category
     *请求方式：POST
     *请求参数：JSON格式的
     * 响应结果【格式统一】：R 对象
     */

    @PostMapping
    public R save(@RequestBody Category category){

        //调用业务层执行添加操作
        categoryService.save(category);
        return R.success("添加成功");
    }

    /**
     *     分类分页查询:
     * 请求url地址： /category/page      ?page=1&pageSize=10
     * 请求方式：GET
     * 请求参数：?page=1&pageSize=10
     * 响应结果【格式统一】：R 对象
     */
    @GetMapping("/page")
    public R<Page> queryPage(Integer page,Integer pageSize){
        //返回的是R 对象，里面放的是totals (总记录数) 和records（列表数据）

        //创建分页对象
        Page<Category> pageInfo = new Page<>(page, pageSize);//pageInfo 查询页面信息
//        Page<Category> page1 = categoryService.page(pageInfo);
//        pageInfo.setRecords(page1.getRecords());
//        pageInfo.setTotal(categoryService.count());

        // 通过pageInfo对象获取分页结果  1、List<> 集合 records  2、总记录数 total
        categoryService.page(pageInfo);

        return R.success(pageInfo);//这里不能传字符串了，上面的指定了泛型page
    }

    /**
     *  删除分类数据
     *
     * 注意的：不能直接调用业务层实现删除操作
     *      判断分类是否存在对应的菜品和套餐
     *      mp提供了上述的业务方法：
     *          自定义删除业务方法：
     * 当前的分类是1 菜品分类，还是2 套餐分类呢，若是菜品分类，
     * 需要查看下当前的分类对应的菜品有没有存在的菜品，套餐则有没有套餐，若都没有就直接删

     *  删除分类:
     *  请求url地址： /category ?id=1504008529740996610
     * 请求方式：DELETE
     * 请求参数：?id=1504008529740996610
     *响应结果【格式统一】：R 对象
     */
    @DeleteMapping
    public R<String> removeById(Long id){
        //调用业务层自定义的删除操作方法  (先到业务层定义方法)
        boolean Result = categoryService.deleteById(id);
        //判断：若这个Result为true,删除成功，Result为false,删除失败
        return Result ? R.success(null):R.error("无法删除分类，当前分类下存在菜品或者套餐");
    }

    /**
     *  更新分类
     *  请求url地址： /category
     * 请求方式：PUT
     * 请求参数：JSON格式的数据
     */
    @PutMapping
    public R update(@RequestBody Category category){

        //调用业务层提供的修改方法
     categoryService.updateById(category);
        return R.success("更新成功");
    }

    /**    新增菜品功能开发
     *  接口1：查询菜品分类列表数据*
     *  请求url地址：/category/list ?type=1   怎么又回到category类呢？因为在新增页面里有个菜品分类的展示框
     *                       因此将新增写道categoryController中
     *  请求方式：GET
     * 请求参数：?type=1
     * 响应结果【格式统一】：R 对象
     *
     * // select * from category where type=1
     * // order by sort desc
     */
    @GetMapping("/list")
    public R addDish(Integer type){
        //怎么又回到category类呢？因为在新增页面里有个菜品分类的查询展示框，
        // 因此将新增写道categoryController中

        //sql语句： // select * from category where type=1 /2 查菜品分类的列表
        // order by sort desc

        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(type!=null,Category::getType,type);
        List<Category> list = categoryService.list(wrapper);//查询多个,接收下最终得到一个集合
        return R.success(list);//把集合返回下

        //接下来需要添加菜品，需要到DishController中去操作
    }

}
